/**    
 * 文件名：Ex2ColorReduce.java    
 *    
 * 版本信息：    
 * 日期：2014年3月7日    
 * xyj 足下 xyj 2014     
 * 版权所有    
 *    
 */
package opencvtest.chapter02;

import static com.googlecode.javacv.cpp.opencv_highgui.CV_LOAD_IMAGE_COLOR;
import static opencvtest.OpenCVUtils.loadMatAndShowOrExit;
import static opencvtest.OpenCVUtils.show;

import java.io.File;

import com.googlecode.javacv.cpp.opencv_core.CvMat;

/**
 * @项目名称：opencv-test
 * @类名称：Ex2ColorReduce
 * @类描述：
 * @创建人：zhuyi
 * @创建时间：2014年3月7日 下午2:41:04
 * @修改人：zhuyi
 * @修改时间：2014年3月7日 下午2:41:04
 * @修改备注：
 * @version
 * 
 */
public class Ex2ColorReduce {

    public static void main(String[] args) {

        // Read input image
        CvMat image = loadMatAndShowOrExit(new File("data/boldt.jpg"), CV_LOAD_IMAGE_COLOR);

        // color reduce
        CvMat dest = colorReduce(image, 64);

        // display
        show(dest, "Reduced colors");
    }

    /**
     * Reduce number of colors.
     * 
     * @param image
     *            input image.
     * @param div
     *            color reduction factor.
     */
    public static CvMat colorReduce(CvMat image, int div) {
        // Total number of elements, combining components from each channel
        System.out.println(image);
        int nbElements = image.rows() * image.cols() * image.channels();
        for (int i = 0; i <= nbElements; i++) {
            // Convert to integer
            int v = (int) image.get(i);
            // Use integer division to reduce number of values
            int newV = v / div * div + div / 2;
            // Put back into the image
            image.put(i, newV);
        }
        return image;
    }
}
